package com.engine.salary.service;

import com.engine.salary.entity.taxagent.config.TaxAgentConfig;
import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeDTO;
import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeTaxAgentDTO;
import com.engine.salary.entity.taxagent.dto.TaxAgentListDTO;
import com.engine.salary.entity.taxagent.dto.TaxAgentManageRangeEmployeeDTO;
import com.engine.salary.entity.taxagent.param.TaxAgentAdminChangeCheckParam;
import com.engine.salary.entity.taxagent.param.TaxAgentQueryParam;
import com.engine.salary.entity.taxagent.param.TaxAgentSaveParam;
import com.engine.salary.entity.taxagent.po.TaxAgentEmployeePO;
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
import com.engine.salary.enums.salarysob.SalaryEmployeeStatusEnum;
import com.engine.salary.enums.taxagent.TaxAgentRoleTypeEnum;
import com.engine.salary.sys.entity.vo.UploadConfigResponse;
import com.engine.salary.util.page.PageInfo;

import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface TaxAgentService {

    /**
     * 获取租户下所有人员的基本信息
     *
     * @return
     */
    List<TaxAgentEmployeePO> listEmployees();

    /**
     * 获取当前登录人角色（返回最大角色，优先级为：总管理员-》管理员-》分管理员）
     *
     * @param currentEmployeeId
     * @return
     */
    TaxAgentRoleTypeEnum getRoleType(Long currentEmployeeId);

    /**
     * 是否需要分权
     *
     * @param currentEmployeeId
     * @return
     */
    Boolean isNeedAuth(Long currentEmployeeId);

    /**
     * 是否是薪酬模块总管理员
     *
     * @param currentEmployeeId
     * @return
     */
    Boolean isChief(Long currentEmployeeId);

    /**
     * 获取管理的扣缴义务人id
     * @param currentEmployeeId
     * @return
     */
    List<Long> getAdminTaxAgentIds(Long currentEmployeeId);

    /**
     * 默认权限是否开启
     *
     * @param currentEmployeeId
     * @return
     */
    Boolean isDefaultOpen(Long currentEmployeeId);

    /**
     * 管理员是否有权限
     *
     * @param currentEmployeeId
     * @return
     */
    Boolean isAdminEnable(Long currentEmployeeId);

    /**
     * 个税扣缴义务人列表(分页)
     *
     * @param queryParam
     * @return
     */
    PageInfo<TaxAgentPO> listPage(TaxAgentQueryParam queryParam);

    /**
     * 个税扣缴义务人列表(不分页)
     *
     * @param queryParam
     * @return
     */
    List<TaxAgentPO> list(TaxAgentQueryParam queryParam);


    /**
     * 根据id查询个税扣缴义务人
     *
     * @param ids
     * @return
     */
    List<TaxAgentPO> listByIds(Collection<Long> ids);

    /**
     * 查询租户下的所有个税扣缴义务人
     *
     * @return
     */
    List<TaxAgentPO> listAll();

    List<TaxAgentPO> listAuth(TaxAgentQueryParam taxAgentQueryParam);

    /**
     * 根据id获取单个个税扣缴义务人
     *
     * @param id
     * @return
     */
    TaxAgentPO getById(Long id);

    /**
     * 获取所有个税扣缴义务人
     *
     * @return
     */
    Collection<TaxAgentListDTO> findAll();

    /**
     * 获取作为管理员或分管理员的个税扣缴义务人列表
     *
     * @param currentEmployeeId 当前登录人id
     * @return
     */
    List<TaxAgentPO> listAllTaxAgents(Long currentEmployeeId);

    /**
     * 获取作为管理员的所有个税扣缴义务人列表
     *
     * @param currentEmployeeId 当前登录人id
     * @return
     */
    Collection<TaxAgentPO> listAllTaxAgentsAsAdmin(Long currentEmployeeId);

    /**
     * 获取作为人员范围中的个税扣缴义务人列表
     *
     * @param employeeIds 被管理的人员id
     * @return
     */
    Collection<TaxAgentEmployeeTaxAgentDTO> listAllTaxAgentsAsRange(List<Long> employeeIds);

    /**
     * 新建个税扣缴义务人
     *
     * @param saveParam
     * @return
     */
    String save(TaxAgentSaveParam saveParam);

    /**
     * 更新代缴机构
     *
     * @param taxAgentPO
     * @return
     */
    String paymentAgencyUpdate(TaxAgentPO taxAgentPO);

    /**
     * 编辑个税扣缴义务人
     *
     * @param saveParam
     * @return
     */
    String update(TaxAgentSaveParam saveParam);

    /**
     * 删除个税扣缴义务人
     *
     * @param ids
     * @return
     */
    String delete(List<Long> ids);

    /**
     * 获取个税扣缴义务人下拉列表
     *
     * @return
     */
    List<Map<String, Object>> selectList(boolean needAuth);

    /**
     * 获取作为管理员的个税扣缴义务人的下拉列表
     *
     * @param chiefCanSeeAll
     * @return
     */
    List<Map<String, Object>> selectListAsAdmin(boolean chiefCanSeeAll);

    /**
     * 是否开启分权
     *
     * @return
     */
    Boolean isOpenDevolution();

    /**
     * 获取个税扣缴义务人和可查看的人员列表(树型)
     *
     * @param employeeId
     * @return
     */
    List<TaxAgentManageRangeEmployeeDTO> listTaxAgentAndEmployeeTree(Long employeeId);

    List<TaxAgentManageRangeEmployeeDTO> listAllTaxAgentAndEmployeeTree();

    /**
     * 获取所有个税扣缴义务人和可查看的人员列表(树型)
     *
     * @return
     */
    List<TaxAgentManageRangeEmployeeDTO> listTaxAgentAndEmployeeTree();

    /**
     * 获取个税扣缴义务人和可查看的人员列表(扁平型)
     *
     * @param employeeId
     * @return
     */
    List<TaxAgentEmployeeDTO> listTaxAgentAndEmployee(Long employeeId);

    /**
     * 获取个税扣缴义务人和可查看的人员列表(扁平型)
     *
     * @param
     * @return
     */
    List<TaxAgentEmployeeDTO> listAllTaxAgentAndEmployee();

    /**
     * 获取个税扣缴义务人和可查看的人员列表(树型)
     *
     * @param employeeStatus
     * @param employeeId
     * @return
     */
    List<TaxAgentManageRangeEmployeeDTO> listTaxAgentAndEmployeeTree(SalaryEmployeeStatusEnum employeeStatus, Long employeeId);

    /**
     * 获取个税扣缴义务人和可查看的人员列表(扁平型)
     *
     * @param employeeStatus
     * @param employeeId
     * @return
     */
    List<TaxAgentEmployeeDTO> listTaxAgentAndEmployee(SalaryEmployeeStatusEnum employeeStatus, Long employeeId);

    /**
     * 更换管理员校验是否有核算数据
     *
     * @param checkParam
     * @return
     */
    Boolean adminChangeCheck(TaxAgentAdminChangeCheckParam checkParam);


    /**
     * 获取个税扣缴义务人下的人员范围
     *
     * @param taxAgentId
     * @return
     */
    Collection<Long> listEmployeeIdsInTaxAgent(Long taxAgentId);

    List<TaxAgentConfig> getConfig();

    List<UploadConfigResponse.Result> parseConfig(List<TaxAgentConfig> configs);
}
